/**
 * 装饰器模式：主要用于代码扩展，比如一个Person类实现了唱跳方法，在不改动原类的基础上扩展rap方法
 * 优点：装饰类和被装饰类可以独立发展，不会相互耦合，装饰模式是继承的一个替代模式，装饰模式可以动态扩展一个实现类的功能
 * 缺点：多层装饰比较复杂
 * 适用场景：扩展一个类的功能，动态增加功能，且不影响其他对象
 */
public class DecoratorPattern {
    public static void main(String[] args) {
        Trainee trainee = new IKun();
        trainee.sing();
        trainee.dance();
        new Decorator(trainee).rap();
    }
}
interface Trainee{
    void  sing();
    void dance();
}
//被装饰的类
class IKun implements Trainee{
    @Override
    public void sing(){
        System.out.println("i can sing");
    }
    @Override
    public void dance(){
        System.out.println("i can dance");
    }
}
//装饰类
class Decorator implements Trainee{
    private Trainee trainee;

    public Decorator(Trainee trainee){
        this.trainee = trainee;
    }

    @Override
    public void sing() {
        trainee.sing();
    }

    @Override
    public void dance() {
        trainee.dance();
    }
    public void rap(){
        System.out.println("i can rap");
    }
}
